
public class Test {
    //多态
    //多态的概念：通俗来说，就是多种形态，具体点就是去完成某个行为，当不同的对象去完成时会产生出不同的状态。
    //总的来说：同一件事情，发生在不同对象身上，就会产生不同的结果。

    //上述都是无用的，理解不了

    //多态实现的条件
    //在Java中要实现多态的条件，必须是满足条件缺一不可：
    //1. 必须在继承体系下 2. 子类必须要对父类中方法进行重写 3. 通过父类的引用调用重写的方法
    //多态体现：在当代码运行时，当传递不同类对象时，会调用类中的方法


    //要想理解：
    //1.向上转型
    //2.子类和父类有同名的（覆盖）/重写方法
    //3.通过父类对象调用父类和子类的重写的方法
    //4.满足以上3点要求，只能说会发生动态绑定
    //5.什么是动态绑定，什么又是静态绑定
    //6.理解上述5点你才能可理解什么是多态，其实多态就是一种思想，但是非常抽象

    //向上转型：
    public static void main(String[] args) {
//        Dog dog = new Dog("lzy");
//        dog.eat();
//        dog.wangWang();
        /*Animals animals = new Animals("lzy");*/
        /*animals.eat();//这时候子类也有了一个eat方法，但是运行还是Animals中的类*/
        /*animals.wangWang();//无法调用一个wangWang，它是子类的，此时只能到调用父类的方法*/

        //这时候，父类引用，引用了子类的对象
        Animals animals = new Dog("lzy");
        animals.eat();//这就叫做动态绑定

    }
}
class Animals{
    public String name;
    public int age;
    public String color;

//    static {
//        System.out.println("Animals的一个静态代码块");
//    }
//
//    {
//        System.out.println("Animals的一个实例代码块");
//    }
    public Animals(String name) {
        this.name = name;
        System.out.println("Animals(String)");
    }

    public void eat(){
        System.out.println(this.name + " 正在吃饭！！----Animals ");
    }
}
class Dog extends Animals{
//    static {
//        System.out.println("Dog的一个静态代码块");
//    }
//
//    {
//        System.out.println("Dog的一个实例代码块");
//    }
    public Dog(String name) {
        super(name);
        System.out.println("Dog的一个构造方法");
    }
    public void wangWang(){
        System.out.println(this.name + "正在汪汪叫！！");
    }
    public void eat(){
        System.out.println(this.name + " 正在吃狗粮 ");
    }
}
//向上转型：
//通俗点说，在继承关系下，就是把子类的对象给到父类
//父类的引用

//方法重写（覆盖）
//1.方法名一样
//2.参数列表一样（个数，类型，顺序）
//3.返回值一样